#!/usr/bin/env perl

# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

###############################################################################

	#
	# Do
	# egrep '^#|name.*=>' hcat.conf | egrep -v '^#!|egrep' | less
	# to get an outline of this test conf file
	#
	
  # Has a couple of Hive set directives:
  #   set hive.exec.dynamic.partition.mode=nonstrict;
  #   set hive.exec.dynamic.partition=true;


$cfg = {
        'driver' => 'Hive',
		'groups' => [
		{
                    'name' => 'Hive_Checkin',
                    'tests' => [ {
                        'num' => 1,
                         'sql' => q\select * from studenttab10k;\,
                         'floatpostprocess' => 1,
                         'delimiter' => '	',
                    },
                    {
                        'num' => 2,
                         'sql' => q\drop table if exists checkin_2;
                         create table checkin_2 as select * from studenttab10k;\,
                         'floatpostprocess' => 1,
                         'delimiter' => '	',
                    },
                    {
                        'num' => 3,
                         'sql' => q\SELECT studenttab10k.* FROM studenttab10k JOIN votertab10k ON (studenttab10k.name = votertab10k.name);\,
                         'floatpostprocess' => 1,
                         'delimiter' => '	',
                    },
                    {
                        'num' => 4,
                         'sql' => q"
                         drop table if exists multi_insert_1_1;
                         drop table if exists multi_insert_1_2;
                         drop table if exists multi_insert_1_3;

                         create table multi_insert_1_1 (
                             name string,
                             ds string)
                             row format delimited
                             fields terminated by '\\t'
                             stored as textfile;

                         create table multi_insert_1_2 (
                             name string,
                             ds string)
                             row format delimited
                             fields terminated by '\\t'
                             stored as textfile;

                         create table multi_insert_1_3 (
                             name string,
                             ds string)
                             row format delimited
                             fields terminated by '\\t'
                             stored as textfile;

                         from studentparttab30k
                             insert overwrite table multi_insert_1_1
                             select name, ds
                             where ds = '20110924'

                             insert overwrite table multi_insert_1_2
                             select name, ds
                             where ds = '20110925'

                             insert overwrite table multi_insert_1_3
                             select name, ds
                             where ds = '20110926';
                             ",
                         'result_table' => ['multi_insert_1_1',
                             'multi_insert_1_2',
                             'multi_insert_1_3'],
                         'verify_sql' =>["select name, ds
                                 from studentparttab30k
                                 where ds = '20110924';",
                             "select name, ds
                                 from studentparttab30k
                                 where ds = '20110925';",
                             "select name, ds
                                 from studentparttab30k
                                 where ds = '20110926';"]
                    } ]
 		}, # end g
                {
                    'name' => 'Hive_Read',
                    'tests' => [ {
                        'num' => 1,
                         # float and double columns removed because mysql and hive can't agree 
                         # on how to round, even using floor/truncate functions
                         'sql' => q\select t, si, i, b, s from all100k;\,
                         'verify_sql' => q\select t, si, i, b, s from all100k;\,
                         'floatpostprocess' => 1,
                         'delimiter' => '	',
                         },{
                        'num' => 2,
                         # double column removed because mysql and hive can't agree 
                         # on how to round, even using floor/truncate functions
                         'sql' => q\select i, s from all100kjson;\,
                         'verify_sql' => q\select i, s from all100kjson;\,
                         'floatpostprocess' => 1,
                         'delimiter' => '	',
                         },{
                        'num' => 3,
                         'sql' => q\select name, age, floor(gpa) from all100krc;\,
                         'verify_sql' => q\select name, age, truncate(gpa, 0) from all100krc;\,
                         'floatpostprocess' => 1,
                         'delimiter' => '	',
                    },{
                         'num' => 4,
                         'sql' => q?
drop table if exists hive_read_4;
create external table hive_read_4 (name string, age int, gpa double) partitioned by (b string) row format delimited fields terminated by '\t' stored as textfile;
alter table hive_read_4 add partition (b='1') location '/user/hcat/tests/data/studenttab10k';
alter table hive_read_4 set fileformat rcfile;
alter table hive_read_4 add partition (b='2') location '/user/hcat/tests/data/all100krc';
select name, age, b from hive_read_4;?,
                         'verify_sql' =>"(select name, age, 1 from studenttab10k)
                            union all
                            (select name, age, 2 from all100krc);",
                         'floatpostprocess' => 1,
                         'delimiter' => '	',
                    } ]
                }, # end g
                {
                    'name' => 'Hive_Write',
                    'tests' => [ {
                        'num' => 1,
                         # float and double columns removed because mysql and hive can't agree 
                         # on how to round, even using floor/truncate functions
                         'sql' => q\
drop table if exists hive_write_1;
create table hive_write_1 (t tinyint, si smallint, i int, b bigint, s string) row format delimited stored as textfile;
insert into TABLE hive_write_1 select t, si, i, b, s from all100k;\,
                         'result_table' => 'hive_write_1',
                         'verify_sql' => q\select t, si, i, b, s from all100k;\,
                         'floatpostprocess' => 1,
                         'delimiter' => '	',
                    },{
                        'num' => 2,
                         'sql' => q\
drop table if exists hive_write_2;
create table hive_write_2 (name string, age int, gpa double) row format serde 'org.apache.hive.hcatalog.data.JsonSerDe' stored as textfile;
insert into TABLE hive_write_2 select s, i, 0.1 from all100kjson;\,
                         'result_table' => 'hive_write_2',
                         'verify_sql' =>"select s, i, 0.1 from all100kjson;",
                         'floatpostprocess' => 1,
                         'delimiter' => '	',
                    },{
                        'num' => 3,
                         'sql' => q\
drop table if exists hive_write_3;
create table hive_write_3 (name string, age int, gpa double) stored as rcfile;
insert into TABLE hive_write_3 select name, age, 1.1 from all100krc;\,
                         'result_table' => 'hive_write_3',
                         'verify_sql' =>"select name, age, 1.1 from all100krc;",
                         'floatpostprocess' => 1,
                         'delimiter' => '	',
                    },{
                        'num' => 4,
                         'sql' => q\
drop table if exists hive_write_4;
create table hive_write_4 (name string, age int, gpa double) stored as sequencefile;
insert into TABLE hive_write_4 select name, age, 1.1 from studenttab10k;\,
                         'result_table' => 'hive_write_4',
                         'verify_sql' =>"select name, age, 1.1 from studenttab10k;",
                         'floatpostprocess' => 1,
                         'delimiter' => '	',
                    } ]
                }
         ]
}
